package com.gtw.visitor;

/**
 * 在不改变结构体的情况下,为结构体中每个元素定义新的操作
 * 优点:
 *      1.单一职责原则:元素自身负责数据的加载,visitor负责新操作,职责分明
 *      2.良好的扩展性:继续增加对数据的操作非常快捷,直接在visitor中增加一个方法
 * 缺点:
 *      1.访问者关注了元素类的内部细节,违反迪米特法则
 *      2.具体元素的增删改(如:再扩增一个具体element),visitor就需要修改,增加对此元素的访问操作
 *      3.访问者依赖具体的元素,破坏了依赖倒置原则,扩展困难
 * 使用场景:
 *      1.一个对象结构包含很多类对象,想对这些对象实施一些依赖于其他类的操作,也就是说迭代器模式已经不能胜任的场景(业务要求遍历多个不同的对象)
 *      2.需要对一个对象结构中的对象进行很多不同且不相关的操作,想避免操作污染这些对象的类
 *      3.数据统计和报表的批处理,eg:统计1.5*elements1 和 1.7*elements2的情况
 *      多分派:
 *      public class RoleImp implement IRole{
 *          public void accept(AbstractActor actor){
 *              actor.act(this);
 *          }
 *          public void doSomething(){
 *              //做自己的事
 *          }
 *      }
 *      public class RealActor extends AbstractActor{
 *          public void act(RoleImpl role){
 *              //该角色下要做的
 *          }
 *      }
 *      4.方法中进行多次instanceof来进行判断,根据多分派变种:
 *      public void doSomething(IRole role){
 *         // if(role instanceof realRole){
 *                  //做1操作
 *         // }else{
 *                  //做2操作
 *         // }
 *          role.doSomething();
 *      }
 */

/**
 * 抽象访问者:声明访问者可以访问哪些元素
 */
public interface IVisitor {

    /**
     * 一般有几个访问元素就有几个访问方法
     */
    public abstract void visit(ConcreteElement1 concreteElement1);
    public abstract void visit(ConcreteElement2 concreteElement2);
}
